package cn.piesat.scanning.service;

import cn.piesat.scanning.dto.HtScanningMetadataDTO;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

/**
 * 源数据服务层信息接口定义
 * @author xhl
 */
public interface HtScanningMetadataService {

    /**
     * 添加源数据至数据库
     * @param dto 源数据实体类
     */
    void addEntity(HtScanningMetadataDTO dto);

    /**
     * 添加源数据至数据库，同时修改任务执行记录
     * @param dto 源数据实体类
     * @param taskId 任务ID
     */
    void addEntity(HtScanningMetadataDTO dto,String taskId);

    void addEntityBatch(List<HtScanningMetadataDTO> dtos, String taskId);

    /**
     * 通过文件名称，查询文件信息
     * @param fileName
     * @return
     */
    HtScanningMetadataDTO findByFileName(String fileName);
    /**
     * 通过文件名称，查询文件信息
     * @param fileName
     * @return
     */
    List<HtScanningMetadataDTO> findAllByFileName(String fileName);

    /**
     * 根据传感器和数据等级查询时间范围内的源数据信息
     * @param sensor 传感器
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param level 数据等级
     * @return
     */
    List<HtScanningMetadataDTO> listBySensorAndRangeTimeAndLevel(String sensor,String startTime,String endTime,String level);

    String[] listFileBySensorAndRangeTimeAndLevel(String productIid,String startTime,String endTime,String level ,String fileType,String fileName);

    List<HtScanningMetadataDTO> listBySensorAndRangeTimeAndLevelAndBand(String sensor, String startTime, String endTime, String level, String band);

    /**
     * 根据产品标识列表、时间范围、等级查询源数据信息。
     * @param productIid 产品标识列表
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param level 数据等级
     * @return
     */
    List<HtScanningMetadataDTO> listByProductIidListAndTimeRangeAndLevel(List<String> productIid, String startTime, String endTime, String level);

    /**
     * 根据文件名称列表查询
     * @param fileNameList 文件名称列表
     * @return
     */
    List<HtScanningMetadataDTO> findByFileNameList(List<String> fileNameList);

    /**
     * 根据时间范围查询文件名称
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return
     */
    Set<String> listByDate(String startTime, String endTime);

    List<HtScanningMetadataDTO> listByProductIidAndBandsAndDataLevelAndLonAndLatAndTimeRange(String productId,String bands,
                                                                                             String dataLevel, String lon, String lat, String leftTime,String rightTime);
    List<HtScanningMetadataDTO> listByBandsAndDataLevelAndRangeTime(String mainMathexp, String level, String startTime, String endTime);

    /**
     * 根据正则和查询时间之前的数据
     * @param date 时间
     * @param regex 正则
     * @return
     */
    List<HtScanningMetadataDTO> regexAndDateRangeFind(String date, String regex);

    void deleteOne(HtScanningMetadataDTO dto);

    List<HtScanningMetadataDTO> listByBandsAndDataLevelRangeTime(List<String> bandsList, String level,
                                                                 String leftTime, String rightTime);

    /**
     * 【数据分区】查找day天前满足数据等级的数据
     * @param day 保留天数
     * @param levelList 等级集合
     * @return
     */
    List<HtScanningMetadataDTO> findBeforeDayAndLevelListData(Integer day, List<String> levelList);

    /**
     * 【数据分区】查找day天内满足数据等级的数据
     * @param day 保留天数
     * @param levelList 等级集合
     * @return
     */
    List<HtScanningMetadataDTO> findAfterDayAndLevelListData(Integer day, List<String> levelList);

    /**
     * 获取指定数据等级的景号，时间范围内的
     * @return
     */
    List<String> groupByViewNumber(String dataLevel, String startTime, String endTime);

    List<HtScanningMetadataDTO> listByBandListAndViewNumberAndLevel(List<String> bandList, String viewNumber, String level);

    List<HtScanningMetadataDTO> listBySensorListAndViewNumberAndLevel(List<String> sensorList, String viewNumber, String level);

    List<HtScanningMetadataDTO> listBySensorAndViewNumberAndLevelAndTimeRange(String sensor, String viewNumber, String level, String startTime, String endTime);


    List<HtScanningMetadataDTO> listByFileCatalogAndDataLevelAndRangeTime(String mainMathexp, String level, String startTime, String endTime);

    List<HtScanningMetadataDTO> findByFileCatalogAndDataLevelAndFileDate(String fileType, String dataLevel, String fileDate);

    void deleteByTaskPlanIdIn(List<String> taskPlanIds);

    List<HtScanningMetadataDTO> listByBandsAndDataLevelAndProductIidAndRangeTime(String mainMathexp, String level, String productIdentify, String startTime, String endTime);

    void deleteByFileDateIn(List<String> deleteFileDates);

    List<HtScanningMetadataDTO> findByFileNameIn(List<String> existListFileName);

    List<HtScanningMetadataDTO> findByFileDateInAndDataLevel(List<String> fileDates,String dataLevel);

    String findByViewNumberDistinct(String viewNumber);

    List<HtScanningMetadataDTO> listByFileCatalogAndRangeTime(String mainMathexp, String startTime, String endTime);

    List<HtScanningMetadataDTO> findByFileCatalogAndFileDate(String fileCatalog, String fileDate);

    List<HtScanningMetadataDTO> findByFileCatalogAndFileDateBetween(String fileCatalog, String leftTime, String rightTime);

    /**
     * 算法数据入库，根据规则查询源数据
     * @param mainMathexp 主文件规则
     * @param productIid 标识 in
     * @param dataLevel 级别
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return
     */
    List<HtScanningMetadataDTO> findByFileCatalogAndProductIidInAndDataLevelAndFileDateBetween(String mainMathexp, List<String> productIid,String dataLevel,String startTime, String endTime);

    /**
     * 算法数据入库，根据规则查询源数据
     * @param productIid 标识 in
     * @param mainMathexp 主文件规则
     * @param dataLevel 级别
     * @param fileDate 时间
     * @return
     */
    List<HtScanningMetadataDTO> findByFileCatalogAndProductIidInAndDataLevelAndFileDate(String mainMathexp, List<String> productIid,String dataLevel,String fileDate);



    List<HtScanningMetadataDTO> findByMetadata(String startTime,String endTime,String level);

    List<HtScanningMetadataDTO> findByMetadata(String startTime,String endTime,String level,String satellite,String product);

    HtScanningMetadataDTO findOneByDate(String startTime,String level,String satellite,String product,String region);
    HtScanningMetadataDTO findOneByDate(String startTime,String level,String satellite,String product,String region,String fileName);
    HtScanningMetadataDTO findByOrbitId(String startTime,String level,String satellite,String product,String region,String fileName,String orbitId);
    HtScanningMetadataDTO findOneByDate(String startTime,String level,String satellite,String product,String region,String productMode,String moduleIid);
    List<HtScanningMetadataDTO> findByMetadata (String startTime,String endTime, String level, String satellite,String product,String fileType);


    HtScanningMetadataDTO findMetadataByParam(String startTime,String level,String satellite,String product,String region,String productMode,String moduleIid,String fileType);

    HtScanningMetadataDTO findMeatedataByMoudel(String startTime,String level,String satellite,String product,String region,String productMode,String moduleIid,String fileType);
    List<HtScanningMetadataDTO> findByMetadata(String startTime,String endTime,String level,String satellite,String product,String region,String fileType);

    List<HtScanningMetadataDTO> findByMetadata(String startTime,String endTime,String level,String satellite,String product,String region,String productMode,String fileType);

    List<HtScanningMetadataDTO> findOneByDate (String startTime,String endTime, String level, String satellite,String product,String region,String productMode,String moduleIid,String fileType);
    List<HtScanningMetadataDTO> findOneByDate (String startTime,String endTime, String level, String satellite,String product,String productMode,String moduleIid,String fileType);

    List<HtScanningMetadataDTO> findListLikeProductMode (String startTime, String level, String satellite,List<String> product,String region,String productMode,String moduleIid,String fileType);


    HtScanningMetadataDTO findMetaDataDto(String startTime,String level,String satellite,String product,String region,String fileType,String moduleIid);
    LinkedList<HtScanningMetadataDTO> findMetaDataDto(String startTime, String level, String satellite, String product, String region, String fileType);


    List<HtScanningMetadataDTO> findByMetadata(List<String> startTime,String level,String satellite,String product,String region,String fileType);

    HtScanningMetadataDTO findGF1(String startTime,String sensor,String level,String satellite,String product,String region,String fileName);



    List<HtScanningMetadataDTO> selectByNotRegion (String endTime, String level, String satellite,String product,String productMode,String moduleIid,String fileType);


    List<HtScanningMetadataDTO> findQxSite (String startTime,String endTime, String level, String satellite,String product,String region,String fileType);

    List<HtScanningMetadataDTO> findBySensor (String startTime,String endTime, String level, String satellite,String product,String region,String fileType,String sensor);
    List<Object[]> findRegionAndFilePath (String startTime,String endTime, String level, String satellite,String product,String fileType);

}
